722. 删除注释
722. 删除注释
Similar Question
Solution Tips
方案一: 模拟
var removeComments = function(source) {
// 对于 行注释, 直接 slice 就行
// 对于 块级注释, 可以使用栈? 没必要吧, 又不会嵌套, 直接找到非重叠的块注释作为结束就好了
// 可以简化到一行处理, 这样无论是行级还是块级处理的逻辑都是相同的
let isInsideBlock = false;
for (let i = 0; i < source.length; i++) {
const line = source[i];
let start = 0;
let end = line.length;
if (isInsideBlock) {
// 在块注释内部, 默认整行删除, 除非找到了闭合
end = 0;
}
for (let j = 0; j < line.length; j++) {
const char = line[j];
if (char === '/') {
if (!isInsideBlock) {
// 不在块注释内部, 寻找下一个字符, 判断是行还是块
const nextChar = line[j + 1] || '';
if (nextChar === '*') {
isInsideBlock = true;
// 块级的第一行, 从这里结束
end = j;
}
else if (nextChar === '/') {
// 行级注释, 直接截断即可
end = j;
}
}
else {
// 除非找到了闭合
const prevChar = line[j - 1] || '';
if (prevChar === '*') {
isInsideBlock = false;
// 块级的最后一行, 从这里开始
start = j + 1;
end = line.length;
// 换行符都被删除了, 需要进行拼接行
// 还是当成一行来做就好, 这样直接删除换行符就处理好了
}
}
}
}
source[i] = line.slice(start, end);
}
return source.filter((line) => line);
};
// console.log(removeComments(["/*Test program */", "int main()", "{ ", " // variable declaration ", "int a, b, c;", "/* This is a test", " multiline ", " comment for ", " testing */", "a = b + c;", "}"]))
console.log(removeComments(["a/*comment", "line", "more_comment*/b"]))
官方题解
Loading Question... - 力扣(LeetCode)
方案二: 单行正则
先转化为一行, 然后用正则直接匹配所有的注释, 替换为空串
String.join("\n", source).replaceAll("//.*|/\\*(.|\n)*?\\*/", "").split("\n")).filter(e -> (e.length() > 0)